package com.topcent.tioxyc.controller;

import lombok.Getter;
import lombok.Setter;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;

@RestController
public class OpenCVMatting001 {

    // 配置参数（根据实际测量调整）
    private static final int TARGET_X = 60;
    private static final int TARGET_Y = 535;
    private static final String FONT_NAME = "Arial";
    private static final int FONT_SIZE = 28;  // 增大字号

    @PostMapping("/local-imgTest001")
    public String localTest(@RequestBody ReplacementRequest request) {
        try {
            // 1. 加载图片并打印基本信息
            BufferedImage image = ImageIO.read(new File(request.getImagePath()));
            System.out.println("图片尺寸: " + image.getWidth() + "x" + image.getHeight());

            // 2. 创建图形上下文
            Graphics2D g = image.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            // 3. 字体配置（带系统验证）
            Font font = checkFontAvailable(FONT_NAME, Font.BOLD, FONT_SIZE);
            g.setFont(font);
            System.out.println("实际使用字体: " + font.getFontName() + " 大小: " + font.getSize());

            // 4. 设置白色文字
            g.setColor(Color.WHITE);  // 修改为白色

            // 5. 调试模式：绘制背景框
            //debugTextPosition(g, TARGET_X, TARGET_Y, request.getNewCode());

            // 6. 正式绘制
            clearTextBackground(g, TARGET_X, TARGET_Y, request.getNewCode());

            // 7. 保存结果
            String outputPath = "D:/img/result_" + System.currentTimeMillis() + ".png";
            ImageIO.write(image, "png", new File(outputPath));

            return generateSuccessResponse(outputPath);
        } catch (Exception e) {
            return "处理失败：" + e.getMessage();
        }
    }

    // 字体可用性检查
    private Font checkFontAvailable(String fontName, int style, int size) {
        String[] availableFonts = GraphicsEnvironment.getLocalGraphicsEnvironment()
                .getAvailableFontFamilyNames();
        if (Arrays.asList(availableFonts).contains(fontName)) {
            return new Font(fontName, style, size);
        }
        System.err.println("警告：字体" + fontName + "不可用，使用默认字体");
        return new Font("SansSerif", style, size);
    }

    private void clearTextBackground(Graphics2D g, int x, int y, String text) {
        FontMetrics metrics = g.getFontMetrics();

        // 原始背景参数（保持不变）
        int padding = 10;
        int bgWidth = metrics.stringWidth(text) + padding * 2 + 12;
        int bgHeight = metrics.getHeight() + padding * 2 - 8;
        int arcSize = 18;
        int bgX = x - padding/2 - 5;
        int bgY = y - metrics.getAscent() - padding/2 - 2;

        // 文字放大系数（1.2表示放大20%）
        float scaleFactor = 1.15f;

        // 创建缩放后的字体（关键修改）
        Font originalFont = g.getFont();
        Font scaledFont = originalFont.deriveFont(originalFont.getSize2D() * scaleFactor);
        g.setFont(scaledFont);

        // 重新计算缩放后的文字尺寸
        FontMetrics scaledMetrics = g.getFontMetrics();
        int scaledTextWidth = scaledMetrics.stringWidth(text);
        int scaledTextHeight = scaledMetrics.getHeight();

        // 保持原始背景绘制（保持不变）
        g.setColor(new Color(22, 185, 223));
        g.fillRoundRect(bgX, bgY, bgWidth, bgHeight, arcSize, arcSize);

        // 计算缩放后的文字位置（自动居中）
        int textX = bgX + (bgWidth - scaledTextWidth)/2;
        int textY = bgY + (bgHeight - scaledTextHeight)/2 + scaledMetrics.getAscent();

        // 绘制放大后的文字
        g.setColor(Color.WHITE);
        g.drawString(text, textX, textY);

        // 恢复原始字体（避免影响后续绘制）
        g.setFont(originalFont);
    }

    private String generateSuccessResponse(String path) {
        return "替换成功！建议用图片查看器检查以下文件：\n" + path;
    }

    @Getter @Setter
    static class ReplacementRequest {
        private String imagePath;
        private String newCode;
    }

    /*private void clearTextBackground(Graphics2D g, int x, int y, String text) {
        FontMetrics metrics = g.getFontMetrics();

        // 1. 计算文字尺寸
        int textWidth = metrics.stringWidth(text);
        int textHeight = metrics.getHeight();

        // 2. 计算圆角背景区域（增加边距）
        int padding = 10;
        int bgWidth = textWidth + padding * 2 + 12;
        int bgHeight = textHeight + padding * 2 - 8;
        int arcSize = 18; // 圆角弧度

        // 3. 背景定位（垂直居中）
        int bgX = x - padding/2 - 5;
        int bgY = y - metrics.getAscent() - padding/2 - 2;

        // 4. 绘制圆角背景
        g.setColor(new Color(0, 180, 200));
        g.fillRoundRect(bgX, bgY, bgWidth, bgHeight, arcSize, arcSize);

        // 5. 文字定位（居中显示）
        int textX = bgX + (bgWidth - textWidth)/2;
        int textY = bgY + padding + metrics.getAscent() - 4;

        // 6. 绘制文字
        g.setColor(Color.WHITE);
        g.drawString(text, textX, textY);

        *//*FontMetrics metrics = g.getFontMetrics();

        // 1. 精确计算文字显示区域
        int textWidth = metrics.stringWidth(text);
        int textHeight = metrics.getHeight();

        // 2. 计算背景区域（带5像素边距）
        int bgWidth = textWidth + 30;
        int bgHeight = textHeight + 5;
        int bgX = x - 10;  // 左对齐调整
        int bgY = y - metrics.getAscent() - 5; // 垂直居中基准

        // 3. 绘制背景（调试用）
        g.setColor(Color.cyan);
        g.fillRect(bgX, bgY, bgWidth, bgHeight);

        // 4. 计算文字绘制位置（在背景区域内居中）
        int textX = bgX + 8;          // 左边距8px
        int textY = bgY + textHeight - metrics.getDescent() + 1; // 下边距px

        // 5. 正式绘制文字
        g.setColor(Color.WHITE);
        g.drawString(text, textX, textY);*//*
    }*/
}